package cn.dwy2002.binaryhandwritingserver.service.impl;

import cn.dwy2002.binaryhandwritingserver.common.Result;
import cn.dwy2002.binaryhandwritingserver.common.utils.RandomIdGenerator;
import cn.dwy2002.binaryhandwritingserver.exception.TagNotFoundException;
import cn.dwy2002.binaryhandwritingserver.mapper.TagsMapper;
import cn.dwy2002.binaryhandwritingserver.pojo.po.Tags;
import cn.dwy2002.binaryhandwritingserver.pojo.vo.TagsVO;
import cn.dwy2002.binaryhandwritingserver.service.service.TagService;
import cn.hutool.core.bean.BeanUtil;
import io.micrometer.common.util.StringUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author 杜伟毅
 * @version 1.0
 * @since 2025/05/31
 */
@Service
@RequiredArgsConstructor
public class TagServiceImpl implements TagService {
    private final TagsMapper tagsMapper;

    @Override
    public Result<Void> createTag(Tags tag) {
        // 1. 参数校验
        if (tag == null) {
            return Result.fail400("标签数据不能为空");
        }
        if (StringUtils.isBlank(tag.getTagName())) {
            return Result.fail400("标签名称不能为空");
        }

        // 2. 检查标签是否已存在
        Tags existingTag = tagsMapper.selectByName(tag.getTagName());
        if (existingTag != null) {
            return Result.fail400("标签名称已存在");
        }

        // 3. 生成ID并插入数据库
        tag.setId(RandomIdGenerator.generateId());
        tagsMapper.insert(tag);

        return Result.success201("标签创建成功");
    }

    @Override
    public Result<Void> updateTag(Tags tag) throws TagNotFoundException {
        // 1. 参数校验
        if (tag == null || tag.getId() == null) {
            return Result.fail400("标签ID不能为空");
        }
        if (StringUtils.isBlank(tag.getTagName())) {
            return Result.fail400("标签名称不能为空");
        }

        // 2. 检查标签是否存在
        Tags existingTag = tagsMapper.selectById(tag.getId());
        if (existingTag == null) {
            throw new TagNotFoundException(tag.getId());
        }

        // 3. 检查新名称是否已存在（如果名称有修改）
        if (!existingTag.getTagName().equals(tag.getTagName())) {
            Tags sameNameTag = tagsMapper.selectByName(tag.getTagName());
            if (sameNameTag != null) {
                return Result.fail400("标签名称已存在");
            }
        }

        // 4. 更新标签
        tagsMapper.update(tag);
        return Result.success201("标签更新成功");
    }

    @Override
    public Result<Void> deleteTag(Long id) throws TagNotFoundException {
        // 1. 参数校验
        if (id == null) {
            return Result.fail400("标签ID不能为空");
        }

        // 2. 检查标签是否存在
        Tags existingTag = tagsMapper.selectById(id);
        if (existingTag == null) {
            throw new TagNotFoundException(id);
        }

        // 3. 删除标签
        tagsMapper.deleteById(id);
        return Result.success201("标签删除成功");
    }

    @Override
    public Result<TagsVO> getTagById(Long id) throws TagNotFoundException {
        // 1. 参数校验
        if (id == null) {
            return Result.fail400("标签ID不能为空");
        }

        // 2. 查询标签
        Tags tag = tagsMapper.selectById(id);
        if (tag == null) {
            throw new TagNotFoundException(id);
        }

        // 3. 转换为VO返回
        return Result.success200("查询成功", BeanUtil.copyProperties(tag, TagsVO.class));
    }

    @Override
    public List<TagsVO> getAllTags() {
        // 查询所有标签并转换为VO
        List<Tags> tags = tagsMapper.selectAll();
        return BeanUtil.copyToList(tags, TagsVO.class);
    }

    @Override
    public Result<TagsVO> getTagByName(String name) {
        // 1. 参数校验
        if (StringUtils.isBlank(name)) {
            return Result.fail400("标签名称不能为空");
        }

        // 2. 查询标签
        Tags tag = tagsMapper.selectByName(name);
        if (tag == null) {
            return Result.fail404("标签不存在");
        }

        // 3. 转换为VO返回
        return Result.success200("查询成功", BeanUtil.copyProperties(tag, TagsVO.class));
    }
}
